/*
*    Qizx/open 3.0 beta
*
* This code is the open-source version of Qizx.
* Copyright (C) 2004-2009 Axyana Software -- All rights reserved.
*
* The contents of this file are subject to the Mozilla Public License 
*  Version 1.1 (the "License"); you may not use this file except in 
*  compliance with the License. You may obtain a copy of the License at
*  http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
*  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
*  for the specific language governing rights and limitations under the
*  License.
*
* The Initial Developer of the Original Code is Xavier Franc - Axyana Software.
*
*/
using System;
using EvaluationException = System.Qizx.Api.EvaluationException;
using Item = System.Qizx.Api.Item;
using XQValue = System.Qizx.XQuery.XQValue;
namespace System.Qizx.XQuery.Dt
{
	
	/// <summary> Sequence of Sequences.</summary>
	public class MultiSequence:GenericValue
	{
		internal XQValue curComp = System.Qizx.XQuery.XQValues.Empty;
		
		internal int index = - 1;
		
		internal System.Collections.ArrayList list = new System.Collections.ArrayList();
		
		public virtual void  add(XQValue seq)
		{
			list.Add(seq);
		}
		
		public override bool Next()
		{
			for (; ; )
			{
				if (curComp.Next())
				{
					item = curComp.Item;
					return true;
				}
				if (++index >= list.Count)
					return false;
				curComp = (XQValue) list[index];
			}
		}
		
		public override double GetFulltextScore(Item item)
		{
			if (item == null)
				item = GetNode();
			for (int i = 0, asize = list.Count; i < asize; i++)
			{
				double score = ((XQValue) list[i]).GetFulltextScore(item);
				if (score >= 0)
					return score;
			}
			return base.GetFulltextScore(item); // fallback
		}
		
		public override XQValue BornAgain()
		{
			MultiSequence museq = new MultiSequence();
			for (int s = 0; s < list.Count; s++)
				museq.list.Add(((XQValue) list[s]).BornAgain());
			return museq;
		}
	}
}